/**
 * @file example_005.cpp
 * @author 逆流 (1171267147@qq.com)
 * @brief boost.Test框架中的测试夹具（Fixture）功能示例
 * @version 0.1
 * @date 2025-11-16
 * 
 * @copyright Copyright (c) 2025
 * 
 */
#define BOOST_TEST_MODULE FixtureExample
#include <boost/test/included/unit_test.hpp>
#include <vector>

// 待测试的栈类
class Stack {
private:
    std::vector<int> data;

public:
    void push(int val) { data.push_back(val); }
    int  pop() {
        int val = data.back();
        data.pop_back();
        return val;
    }
    bool   is_empty() const { return data.empty(); }
    size_t size() const { return data.size(); }
};

// 定义测试夹具类
class StackFixture {
protected:
    Stack stack;  // 待测试的栈对象（所有测试用例共享此对象的初始化/清理逻辑）

    // 初始化：测试用例执行前调用（构造函数）
    StackFixture() {
        // 例如：预先推入一些测试数据
        stack.push(10);
        stack.push(20);
    }

    // 清理：测试用例执行后调用（析构函数）
    ~StackFixture() {
        // 例如：清空栈（这里Stack的析构函数会自动清理，仅作示例）
        while (!stack.is_empty()) {
            stack.pop();
        }
    }
};

// 测试用例1：绑定到StackFixture夹具
BOOST_FIXTURE_TEST_CASE(test_pop, StackFixture) {
    BOOST_CHECK_EQUAL(stack.size(), 2);  // 夹具已初始化，栈中有2个元素
    BOOST_CHECK_EQUAL(stack.pop(), 20);  // 弹出栈顶（20）
    BOOST_CHECK_EQUAL(stack.size(), 1);
}

// 测试用例2：同样使用StackFixture夹具（每个用例会重新初始化夹具）
BOOST_FIXTURE_TEST_CASE(test_is_empty, StackFixture) {
    BOOST_CHECK(!stack.is_empty());  // 初始状态非空
    stack.pop();
    stack.pop();
    BOOST_CHECK(stack.is_empty());  // 弹出所有元素后为空
}